package DyingBaby.backend.catalog;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据库表的结构定义类
 * 包含描述一个表所需的所有元数据信息
 * 用于定义表的名称、列结构以及主键约束
 */
public class TableSchema {
    private final String tableName; // 表名
    private final List<ColumnDef> columns; // 列定义列表（保持列的顺序）
    private final String primaryKey; // 主键列名（可选，可为null表示无主键）

    /**
     * 构造函数：创建表结构定义
     * @param tableName 表名称
     * @param columns 列定义列表
     * @param primaryKey 主键列名（可为null）
     */
    public TableSchema(String tableName, List<ColumnDef> columns, String primaryKey) {
        this.tableName = tableName;
        // 创建不可修改的列表副本，确保表结构一旦创建就不能被意外修改
        this.columns = Collections.unmodifiableList(columns);
        this.primaryKey = primaryKey;
    }

    /**
     * 获取表名
     * @return 表名称
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 获取列定义列表
     * @return 不可修改的列定义列表（保持原始顺序）
     */
    public List<ColumnDef> getColumns() {
        return columns;
    }

    /**
     * 获取主键列名
     * @return 主键列名（可能为null表示无主键）
     */
    public String getPrimaryKey() {
        return primaryKey;
    }

    /**
     * 提供一个列名到列定义对象的快速映射
     * 使用LinkedHashMap保持列的顺序
     * @return 列名到列定义的映射
     */
    public Map<String, ColumnDef> getColumnMap() {
        Map<String, ColumnDef> map = new LinkedHashMap<>();
        for (ColumnDef cd : columns) {
            map.put(cd.getName(), cd);
        }
        return map;
    }
} 